package fs2

import (
	"github.com/sirupsen/logrus"
	"mydocker/cgroups/resource"
	"mydocker/common"
	"os"
	"path"
)

type MemorySubsystem struct {
}

// Name 返回 cgroup 名字
func (*MemorySubsystem) Name() string {
	return "memory"
}

// Set 设置 cgroupPath 对应的 cgroup 的内存资源限制
func (m *MemorySubsystem) Set(cgroupPath string, res *resource.ResourceConfig) error {
	if res.MemoryLimit == "" {
		return nil
	}
	subSystemCgroupPath, err := getCgroupPath(cgroupPath, true)
	if err != nil {
		logrus.Errorf("get %s path, err: %v", cgroupPath, err)
		return err
	}
	// 设置 cgroup 内存限制
	// 在 cgroup v2 中，通过 /sys/fs/cgroup/<cgroup>/memory.max 文件来设置内存限制。这个文件定义了 cgroup 中所有进程可以使用的最大内存量（包括匿名内存和文件缓存）。
	if err = os.WriteFile(path.Join(subSystemCgroupPath, "memory.max"), []byte(res.MemoryLimit), common.Perm0644); err != nil {
		return err
	}
	return nil
}

func (m *MemorySubsystem) Apply(cgroupPath string, pid int) error {
	return applyCgroup(pid, cgroupPath)
}

func (m *MemorySubsystem) Remove(cgroupPath string) error {
	subsystemCgroupPath, err := getCgroupPath(cgroupPath, false)
	if err != nil {
		logrus.Errorf("get %s path, err: %v", cgroupPath, err)
		return err
	}
	return os.RemoveAll(subsystemCgroupPath) // 删除指定的文件或目录，以及任何子目录和子文件
}
